package kr.pe.johnkim.sendme.activity;

import java.util.ArrayList;
import java.util.List;

import kr.pe.johnkim.sendme.provider.SendMeFriend;
import kr.pe.johnkim.sendme.provider.SendMeFriendAdapter;
import kr.pe.johnkim.sendme.provider.SendMeInstall;
import kr.pe.johnkim.sendme.provider.SendMeLog;
import kr.pe.johnkim.sendme.rest.SendMeInstallRest;
import kr.pe.johnkim.sendme.rest.SendMeLogRest;
import kr.pe.johnkim.sendme.util.SendMeActivityManager;
import kr.pe.johnkim.sendme.util.SendMeCommon;
import kr.pe.johnkim.sendme.util.SendMeConstant;
import kr.pe.johnkim.sendme.util.SendMeDBManagerInstallUser;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageButton;
import android.widget.ListView;

/**
 * 음성 메시지를 생성하기 위해서 친구 목록을 출력하는 액티비티 클래스 이다.
 *  
 * @author johnkim
 *
 */
public class SendMeFriendActivity extends ListActivity implements OnScrollListener {
	
	public static String TAG = SendMeFriendActivity.class.getSimpleName();
	
	// 액티비티 매니저를 가져 온다.
	private SendMeActivityManager sendMeActivityManager = SendMeActivityManager.getInstance();
	
	// 마스터 암호.
	private String MASTER_PASSWORD = "";
		
	// 퍼블릭 암호.
	private String PUBLIC_PASSWORD = "";
		
	// 기능 모드.(MASTER/PUBLIC)
	private String FUNCTION_MODE = "";
		
	// 사용자 휴대 전화번호.
	private String PHONE_NUMBER = "";
	
	ImageButton imageButtonTopBack;
	ImageButton imageButtonTopMainMenu;
	Button record_and_send_message_btn;
	
	// 필터링
	EditText editTextFriendName;

	private ProgressDialog dialog;
	
	
	// 로그를 남긴다
	private static final int THREAD_REGISTER_LOG = 100;
	
	// 앱을 종료 한다.
	private static final int ALERT_DIALOG_EXIT_ID = 101;
	
	// 차단 목록을 가져 온다.
	private static final int THREAD_SELECT_BLOCK_LISET = 102;
	
	// 설치여부 목록을 가져 온다.
	private static final int THREAD_SELECT_INSTALL_LIST = 103;
	
	// 전화번호부 친구 목록을 가져 온다.
	private static final int THREAD_FRIEND_LIST = 104;
	
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 105;
		
	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 106;
	
	// 상대방을 선택하라는 dialog 창을 띄운다
	private static final int THREAD_RECEIVER_NOT_SELECTED = 117;
	
	// 녹음 화면 호출
	private static final int RECORDING_SCREEN_CALL = 135;
	
	// 예약 화면에서 메뉴를 콜함. 이 액티비티도 종료해야함
	private static final int RESULT_MAIN_MENU_CALLED = 600;	
	
	
	
	// 친구 어댑터 클래스.
	private SendMeFriendAdapter sendMeFriendAdapter;

	// sqlite 에 저장되어 있는 설치 사용자 목록
	private ArrayList<SendMeInstall> sqliteInstallList = null;		
	
	// 전화번호부에 저장되어 있는 전화번호 목록
	private ArrayList<SendMeFriend> phoneBookFriendList = null;
	
	// 화면 출력용 친구 목록.
	private ArrayList<SendMeFriend> friendList = null;

	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		// 커스텀 타이블 바를 설정 한다.
		Window window = getWindow();
		window.requestFeature(Window.FEATURE_CUSTOM_TITLE);
				
		setContentView(R.layout.activity_send_me_friend);
		
		window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_03);
		
		// 액티비티 매니저에 담는다.
		sendMeActivityManager.addActivity(this);
				
		// 설정파일을 가져 온다.
		this.confirmNotification();
		
		
		// 뒤로 가기 화살표 버튼을 설정 한다.
		imageButtonTopBack = (ImageButton)findViewById(R.id.imageButtonTopBack);
		imageButtonTopBack.setOnClickListener(new View.OnClickListener() {
					
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
						
				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeFriendActivity.this);
				finish();
			}
		});
		
		// 타이틀바의 메인 메뉴 버튼을 설정 한다.
		imageButtonTopMainMenu = (ImageButton)findViewById(R.id.imageButtonTopMainMenu);
		imageButtonTopMainMenu.setOnClickListener(new OnClickListener() {
					
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Log.i(TAG, "pressed top main menu.");
						
				// 메인 메뉴 화면을 출력 한다.
				Intent i = new Intent(SendMeFriendActivity.this, SendMeMainMenuActivity.class);
				startActivity(i);
				
				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeFriendActivity.this);
				finish();
				
			}
		});
		
		record_and_send_message_btn = (Button)findViewById(R.id.record_and_send_message_btn);
		record_and_send_message_btn.setOnClickListener(new OnClickListener() {
					
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
	
				// 선택된 사람이 있는지 체크한다. 리스트에 담는다.
				ArrayList<String> stringReceiverArrayList = new ArrayList<String>();
				ArrayList<String> stringReceiverNameArrayList = new ArrayList<String>();
					for(int i=0; i<friendList.size(); i++){
						if((friendList.get(i)).getIsSelectedForSend()){
							stringReceiverArrayList.add((friendList.get(i)).getPhoneNumber());
							stringReceiverNameArrayList.add((friendList.get(i)).getName());
						}
					}
				//if you want your array
				String [] receiverList = stringReceiverArrayList.toArray(new String[stringReceiverArrayList.size()]);
				String [] receiverNameList = stringReceiverNameArrayList.toArray(new String[stringReceiverNameArrayList.size()]);
				
				if(receiverList.length<1) {				// 선택된 사람이 아무도 없다.
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_RECEIVER_NOT_SELECTED));
					Log.d(TAG,"no one selected");
				} else {				// 리스트 가지고 녹음 화면으로 이동
//					/**
//					 * 음성 녹음 액티비티 실행 
//					 */
					Intent recordActivity = new Intent(SendMeFriendActivity.this, SendMeAudioRecordActivity.class);
					recordActivity.putExtra("receiverList", receiverList);
					recordActivity.putExtra("receiverNameList", receiverNameList);
					startActivityForResult(recordActivity, RECORDING_SCREEN_CALL);
					
//					// 화면을 닫는다.
//					sendMeActivityManager.removeActivity(SendMeFriendActivity.this);
//					finish();
				}
			}
		});
		
		
		// 화면 출력을 위한 친구 목록을 생성 한다.
		friendList = new ArrayList<SendMeFriend>();
		
		// 친구 어댑터를 생성 한다.
		sendMeFriendAdapter = new SendMeFriendAdapter(getApplicationContext(), friendList);
		
		// list view 의 cursor 를 제공하기 위해서 어댑터를 세팅 한다.
		setListAdapter(sendMeFriendAdapter);
		
		// 스크롤 이벤트 리스너를 등록 한다.
		getListView().setOnScrollListener(this);
		
		// list 레이아웃 그리기 캐쉬를 설정 한다.
		getListView().setAlwaysDrawnWithCacheEnabled (true);
		
		// 리스트 검색어 필터링
		editTextFriendName = (EditText) findViewById(R.id.editTextFriendName);
		editTextFriendName.addTextChangedListener(new TextWatcher() {
		    @Override
		    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
		    	Log.d(TAG,"onTextChanged:"+cs);
		        // When user changed the Text
//		    	SendMeFriendActivity.this.adapter.getFilter().filter(cs);
		    	sendMeFriendAdapter.getFilter().filter(cs);
		    }
		    @Override
		    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }
		    @Override
		    public void afterTextChanged(Editable arg0) {}
		});
		
		
		// 로깅.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REGISTER_LOG));
		
		
		
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_SELECT_INSTALL_LIST));
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.send_me_friend, menu);
		return true;
	}
	
	/**
	 * 필요한 핸들러를 등록해서 사용한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			
			// 로그를 남긴다
			case THREAD_REGISTER_LOG : 
				threadRegisterLog();
				break;
			case ALERT_DIALOG_EXIT_ID : 
				break;
			// 차단 목록을 가져 온다.
			case THREAD_SELECT_BLOCK_LISET : 
				break;
			// 설치 여부 목록을 가져 온다.
			case THREAD_SELECT_INSTALL_LIST : 
				// sqlite 에서 조회하여 리스트에 저장된 것을 조회, 디바이스의 전화번호부 조회. 둘을 합쳐서 화면 출력용 리스트 생성. 
				threadProcessFriendListForShow();	
				break;
			// 친구 목록을 세팅해서 출력 한다.
			case THREAD_FRIEND_LIST : 
				runOnUiThread(selectFriendList);
				break;
				// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
					
					dialog.show();
				break;
				// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				dialog.hide();
				break;
			// 상대방을 선택하라는 dialog 를 띄운다
			case THREAD_RECEIVER_NOT_SELECTED : 
				showDialogReceiverNotSelected();
				break;
			}
		}
	};
	
	
	
	
	
	
	
	/**
	 * 상대방 선택하라는 dialog 를 띄운다.
	 */
	private void showDialogReceiverNotSelected() {
		new AlertDialog.Builder(SendMeFriendActivity.this)
		.setTitle("상대방 선택")
		.setMessage("음성 메시지를 보낼 대상을 선택해 주시기 바랍니다.")
		.setNegativeButton("확인", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {

			}
		}).show();
	}
	
	/**
	 * sqlite 에서 조회하여 리스트에 저장된 것을 조회, 디바이스의 전화번호부 조회. 둘을 합쳐서 화면 출력용 리스트 생성. 
	 */
	public void threadProcessFriendListForShow() {

		Thread thread = new Thread(new Runnable() {

			public void run() {
				
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
				
				Log.d(TAG,"threadProcessFriendListForShow");
				
				/*
				 *  sqlite 에 저장된 설치 유저 목록. 전번, 이름, 닉네임, 설치여부까지 포함됨.
				 */
				SendMeDBManagerInstallUser sendMeDBManagerInstallUser = new SendMeDBManagerInstallUser(returnThis());
				friendList = sendMeDBManagerInstallUser.selectInstallUserData();
				
				/*
				 * 전화번호부.
				 */
				
//				// 필터링을 위해서 닉네임이 있으면 이름 자리에 닉네임 세팅하도록 함. ###  --> 이름으로 사용
//				for(int i=0; i<friendList.size(); i++){			
//					if(friendList.get(i).getNickName().length()>0){
//						friendList.get(i).setName(friendList.get(i).getNickName());
//					}
//				}
				
				// 작업이 끝났다면 화면에 세팅하는 메소드를 호출
				Log.d(TAG,"produce list end. call show list method.");
				// ...  THREAD_FRIEND_LIST
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_FRIEND_LIST));
				
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
				
			}
		});
		thread.start();
	}
	
	/**
	 * 친구 목록을 세팅해서 출력 한다.
	 */
	private Runnable selectFriendList = new Runnable() {
		
		@Override
		public void run() {
			// TODO Auto-generated method stub
			
			// sqlite 목록과 전화번호부를 비교하여 적용할 최종 리스트를 생성한다. 		sqliteFriendList		phoneBookFriendList		friendList
			
			sendMeFriendAdapter = new SendMeFriendAdapter(returnThis(), friendList);
			getListView().setAdapter(sendMeFriendAdapter);
			
//			// 최종 리스트를 아답터에 적용한다
//			sendMeFriendAdapter.notifyDataSetChanged();
			
		}
	};
	
	
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 서버 통신
	
	/**
	 * 로그를 남긴다	 
	 */
	public void threadRegisterLog() {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				String nowTime = sendMeCommon.getCurrentDate();
				
				SendMeLog sendMeLog = new SendMeLog();
				sendMeLog.setPhoneNumber(PHONE_NUMBER);
				sendMeLog.setViewName(TAG);
				sendMeLog.setRegisterDate(nowTime);
				
				SendMeLogRest sendMeLogRest = new SendMeLogRest();
				
				sendMeLogRest.registerLog(sendMeLog);
			}
		});
		thread.start();
	}
	
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	
	@Override
	public void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		Bundle extraBundle;
		if( requestCode == RECORDING_SCREEN_CALL ) {
			
			if(resultCode == Activity.RESULT_OK){		// 정상 반환시.
				Log.d(TAG,"RESULT_OK");
				extraBundle = data.getExtras();		// 번들을 반환했으니까 번들을 불러오면 세팅된 값을 가지고 있음.

//				String key1 = extraBundle.getString("key1");	
//				Log.d(TAG,"key1:"+key1);
				
			}else if(resultCode == Activity.RESULT_CANCELED){
				Log.d(TAG,"RESULT_CANCELED");
			}else if(resultCode == RESULT_MAIN_MENU_CALLED){
				Log.d(TAG,"RESULT_MAIN_MENU_CALLED");
				
				// 화면을 닫는다.
				sendMeActivityManager.removeActivity(SendMeFriendActivity.this);
				finish();
				
			}
		}
	}
	
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	// 컨텍스트 반환
		public Context returnThis() {
			return this;
		}
	
	
	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void confirmNotification() {
		SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);

		MASTER_PASSWORD = mSharedPreference.getString("master_password", "");
		PUBLIC_PASSWORD = mSharedPreference.getString("public_password", "");
		FUNCTION_MODE = mSharedPreference.getString("function_mode", "");
		PHONE_NUMBER = mSharedPreference.getString("phone_number", "");
	}
	
	
	@Override
	public void onResume(){
		super.onResume();
		
		dialog = ProgressDialog.show(SendMeFriendActivity.this, "", "Wait..", true);
		dialog.hide();
	}
	
	/**
	 * 뒤로 가기 버튼을 정의 한다.
	 * 화면을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		sendMeActivityManager.removeActivity(this);
		finish();
	}

	@Override
	public void onStop(){
		super.onStop();
		dialog.dismiss();
	}
	
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub
		
	}

}
